
#include <NIPC.h>
#include <log.h>
#include "manejoDeListas.h"

/******************************************************************************
 *                           Funcion inicializarLista                         *
 ******************************************************************************/
void inicializarLista(t_listaNIPC *lista, sem_t* m_lista){
	sem_wait(&m_lista);

	lista->cabeza 	= NULL;
	lista->cola 	= NULL;
	lista->total 	= 0;

	sem_post(&m_lista);
}


/******************************************************************************
 *                            Funcion crearNodo                               *
 ******************************************************************************/

t_nodoNIPC* crearNodo(t_paqueteNIPC* paqueteNIPC){

	t_nodoNIPC* nuevo;

	if ((nuevo = (t_nodoNIPC*) malloc(sizeof(t_nodoNIPC))) == NULL) {
		t_log* log = log_create("Runner", "log.txt", DEBUG | INFO, M_CONSOLE_DISABLE);
		log_error(log, "thread-1", "Message error: %s", "No se pudo crear un nuevo nodo");
	}

	nuevo->paquete = malloc(sizeof(t_paqueteNIPC));
	nuevo->paquete = paqueteNIPC;
	nuevo->siguiente = NULL;

	return  nuevo;
}

/******************************************************************************
 *                            Funcion agregarNodo                             *
 ******************************************************************************/
void agregarNodo(t_listaNIPC *lista, t_paqueteNIPC* paqueteNIPC, sem_t* m_lista){

	t_nodoNIPC* nodo = crearNodo(paqueteNIPC);

	sem_wait(&m_lista);

	if (lista->cabeza == NULL){
		lista->cabeza = nodo;
		lista->cola = nodo;

	}
	else{
		lista->cola->siguiente = nodo;
		lista->cola = nodo;
	}

	lista->total++;

	sem_post(m_lista);
}

/******************************************************************************
 *                            Funcion sacarNodo                               *
 ******************************************************************************/

t_nodoNIPC* sacarNodo(t_listaNIPC* lista, sem_t* m_lista){

	if (lista->cabeza != NULL){
		t_nodoNIPC* nodo;

		if ((nodo = (t_nodoNIPC*) malloc(sizeof(t_nodoNIPC))) == NULL) {
			t_log* log = log_create("Runner", "log.txt", DEBUG | INFO, M_CONSOLE_DISABLE);
			log_error(log, "thread-1", "Message error: %s", "Crash!!!!");
		}

		sem_wait(&m_lista);

		nodo 			= lista->cabeza;
		lista->cabeza 	= nodo->siguiente;

		lista->total--;

		sem_post(m_lista);

		return nodo;

	}

	return NULL;


}
